﻿
namespace SistemaLogistica.DataAccess
{
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using SistemaLogistica.Business.Entities;

    public class CargoData : BaseDataAccess
    {
        private CargoData() { }

        private readonly static CargoData instancia = new CargoData();

        public static CargoData Instancia
        {
            get { return instancia; }
        }

        public List<Cargo> Listar()
        {
            List<Cargo> cargos = new List<Cargo>();

            DbCommand command = db.GetStoredProcCommand("GetAllFromCargo");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    cargos.Add(new Cargo
                    {
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        IdCargo = dr.GetInt32(dr.GetOrdinal("IdCargo")),
                        IdCargoSuperior = dr.IsDBNull(dr.GetOrdinal("IdCargoSuperior")) ? byte.MinValue : dr.GetInt32(dr.GetOrdinal("IdCargoSuperior")),
                        Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                        Area = AreaData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdArea")))
                    });
                }
            }
            return cargos;
        }

        public List<Cargo> Buscar(string nombre)
        {
            List<Cargo> cargos = new List<Cargo>();

            DbCommand command = db.GetStoredProcCommand("SearchCargos");
            db.AddInParameter(command, "nombre", DbType.String, nombre);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    cargos.Add(new Cargo
                    {
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        IdCargo = dr.GetInt32(dr.GetOrdinal("IdCargo")),
                        IdCargoSuperior = dr.IsDBNull(dr.GetOrdinal("IdCargoSuperior")) ? byte.MinValue : dr.GetInt32(dr.GetOrdinal("IdCargoSuperior")),
                        Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                        Area = AreaData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdArea")))
                    });
                }
            }
            return cargos;
        }

        public List<Cargo> ListarPorCargoSuperior(int cargoSuperiorID)
        {
            List<Cargo> cargos = new List<Cargo>();

            DbCommand command = db.GetStoredProcCommand("GetCargosByCargoSuperiorID");
            db.AddInParameter(command, "idCargoSuperior", DbType.Int32, cargoSuperiorID);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    cargos.Add(new Cargo
                    {
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        IdCargo = dr.GetInt32(dr.GetOrdinal("IdCargo")),
                        IdCargoSuperior = dr.IsDBNull(dr.GetOrdinal("IdCargoSuperior")) ? byte.MinValue : dr.GetInt32(dr.GetOrdinal("IdCargoSuperior")),
                        Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                        Area = AreaData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdArea")))
                    });
                }
            }
            return cargos;
        }

        public List<Cargo> ListarPorArea(int areaID)
        {
            List<Cargo> cargos = new List<Cargo>();

            DbCommand command = db.GetStoredProcCommand("GetCargosByAreaID");
            db.AddInParameter(command, "idArea", DbType.Int32, areaID);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    cargos.Add(new Cargo
                    {
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        IdCargo = dr.GetInt32(dr.GetOrdinal("IdCargo")),
                        IdCargoSuperior = dr.IsDBNull(dr.GetOrdinal("IdCargoSuperior")) ? byte.MinValue : dr.GetInt32(dr.GetOrdinal("IdCargoSuperior")),
                        Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                        Area = AreaData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdArea")))
                    });
                }
            }
            return cargos;
        }

        public Cargo ObtenerPorID(int cargoID)
        {
            Cargo cargo = null;
            DbCommand command = db.GetStoredProcCommand("GetCargoByIdCargo");
            db.AddInParameter(command, "idCargo", DbType.Int32, cargoID);

            IDataReader dr = db.ExecuteReader(command);
            while (dr.Read())
            {
                cargo = new Cargo
                {
                    Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                    IdCargo = dr.GetInt32(dr.GetOrdinal("IdCargo")),
                    IdCargoSuperior = dr.IsDBNull(dr.GetOrdinal("IdCargoSuperior")) ? byte.MinValue : dr.GetInt32(dr.GetOrdinal("IdCargoSuperior")),
                    Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                    Area = AreaData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdArea")))
                };
            }
            return cargo;
        }

        public bool Agregar(Cargo cargo)
        {
            DbCommand command = db.GetStoredProcCommand("InsertCargo");
            db.AddInParameter(command, "descripcion", DbType.String, cargo.Descripcion);
            db.AddInParameter(command, "idArea", DbType.Int32, cargo.Area.IdArea);
            db.AddOutParameter(command, "idCargo", DbType.Int32, 11);
            db.AddInParameter(command, "idCargoSuperior", DbType.Int32, cargo.IdCargoSuperior);
            db.AddInParameter(command, "nombre", DbType.String, cargo.Nombre);

            int result = db.ExecuteNonQuery(command);

            if (result != 0) return true;
            else return false;
        }

        public bool Actualizar(Cargo cargo)
        {
            DbCommand command = db.GetStoredProcCommand("UpdateCargo");
            db.AddInParameter(command, "descripcion", DbType.String, cargo.Descripcion);
            db.AddInParameter(command, "idArea", DbType.Int32, cargo.Area.IdArea);
            db.AddInParameter(command, "idCargo", DbType.Int32, cargo.IdCargo);
            db.AddInParameter(command, "idCargoSuperior", DbType.Int32, cargo.IdCargoSuperior);
            db.AddInParameter(command, "nombre", DbType.String, cargo.Nombre);

            int result = db.ExecuteNonQuery(command);

            if (result != 0) return true;
            else return false;
        }

        public void Eliminar(int cargoID)
        {
            DbCommand command = db.GetStoredProcCommand("DeleteCargo");
            db.AddInParameter(command, "idCargo", DbType.Int32, cargoID);
            db.ExecuteNonQuery(command);
        }
    }
}
